package com.woniuxy.test_likedlist;

/**
 * description: SxLinkedList01 <br>
 * date: 2022/2/3 2:16 下午 <br>
 * author: shesaifei <br>
 * version: 1.0 <br>
 */

/**
 * 自定义一个链表
 * 增加get方法
 * 增加删除方法
 * 增加了set方法
 */
public class SxLinkedList04 {
    private Node first; //第一个节点
    private Node last;  //最后一个节点

    private int size;

    public Object get(int index) {
        checkElementIndex(index);

        Node temp = getNode(index);
        return temp != null ? temp.element : null;
    }

    public void set(int index, Object obj) {
        checkElementIndex(index);
        Node newNode = new Node(obj);
        Node temp = getNode(index);

        if (temp != null) {
            Node up = temp.previous;
            up.next = newNode;
            newNode.previous = up;

            newNode.next = temp;
            temp.previous = newNode;
        }
    }

    public void checkElementIndex(int index) {
        if (index < 0 || index > size - 1) {
            throw new RuntimeException("索引数字不符合：" + index);
        }
    }

    public Node getNode(int index) {
        Node temp = null;
        if (index <= (size >> 1)) {
            temp = first;
            for (int i = 0; i < index; i++) {
                temp = temp.next;
            }
        } else {
            temp = last;
            for (int i = size - 1; i > index; i--) {
                temp = temp.previous;
            }
        }
        return temp;
    }


    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder("[");
        Node temp = first;
        //挨个遍历链表中的元素
        while (temp != null) {
            sb.append(temp.element + ",");
            temp = temp.next;
        }
        sb.setCharAt(sb.length() - 1, ']');
        return sb.toString();
    }

    /**
     * 第一次:[]
     * 第二次:["a"]
     * 第三次:["a","b"]
     *
     * @param obj
     */
    public void add(Object obj) {
        //创建一个节点：需要上一个元素和下一个元素
        Node node = new Node(obj);
        if (first == null) {  //第一次往里面放数据
            first = node;
            last = node;
        } else {

            node.previous = last; //第二次上一个节点就是第一次的最后的节点
            node.next = null; //刚加的数据我就是最后一个数据，没有下一个数据，所以为空

            last.next = node;
            last = node;
        }

        size++;
    }

    public void remove(int index) {
        //判断删除的索引是否越界
        checkElementIndex(index);
        Node temp = getNode(index);
        if (temp != null) {
            Node up = temp.previous;
            Node down = temp.next;

            if (up != null) {
                up.next = down;
            }
            if (down != null) {
                down.previous = up;
            }
            //被删除的元素是第一个
            if (index == 0) {
                first = down;
            }
            //被删除的元素是最后一个
            if (index == size - 1) {
                last = up;
            }
        }
    }

    public static void main(String[] args) {

        SxLinkedList04 list04 = new SxLinkedList04();
        list04.add("a");
        list04.add("b");
        list04.add("c");
        list04.add("d");
        list04.add("e");
        list04.add("f");
        System.out.println(list04);
        list04.set(1, "ss");
        System.out.println(list04);
//        list02.remove(0);
//        System.out.println(list02);
//        list02.remove(7);
//        System.out.println(list02);
        //System.out.println(list02.get(2));
    }

}
